package getter

import (
	"server/game/model"
	"server/game/pkg/rank"
	"strings"

	"github.com/hwcer/yyds/context"
)

/**
 * @name sort
 * 排行榜
 */
/**
 * @name /
 * @param string key 排行榜标识
 * @param int si 开始位置(0开始)
 * @param int ei 结束位置(开始)
 * @param string fields 需要额外获取玩家的基本信息
 * @tip ladder:竞技场 PvP_3V3_Sort:3v3对战排行榜 lvSort:等级排行榜 fightSort:战力排行榜 主线排行榜:stageSort
 * @tip 一次拉取区间不能超过20个
 * @tip 返回的玩家默认字段只包含[lv,name]
 * 排行榜

 */
func init() {
	Register(Sort)
}

// { 'sort': -1, 'rows': [], 'order': {} }
func Sort(c *context.Context) interface{} {
	uid := c.Uid()
	args := &struct {
		Name   string `json:"key"`
		Circle int64  `json:"circle"` //界数，默认本届
		Si     int64  `json:"si"`
		Ei     int64  `json:"ei"`
		Fields string `json:"fields"`
	}{}

	if err := c.Bind(args); err != nil {
		return err
	}
	ps, err := rank.ZRange(args.Name, args.Circle, args.Si, args.Ei)
	if err != nil {
		return err
	}
	r := map[string]any{}
	orderMap := map[string][]int64{}
	var arr []string
	for _, p := range ps {
		orderMap[p.Uid] = []int64{p.Rank, p.Score}
		if uid == p.Uid {
			r["sort"] = p.Rank
		}
		arr = append(arr, p.Uid)
	}
	r["order"] = orderMap
	//个人排行，每次都要，无脑了
	if _, ok := r["sort"]; !ok {
		var p *rank.Player
		if p, err = rank.ZRank(args.Name, args.Circle, c.Uid(), true); err != nil {
			return err
		}
		r["sort"] = p.Rank
	}
	//获取属性
	var rows []map[string]any
	if len(arr) > 0 {
		tx := db.Model(&model.Role{}).Select("lv", "name").Where(arr)
		if args.Fields != "" {
			f := strings.Split(args.Fields, ",")
			tx = tx.Select(f...)
		}
		if tx = tx.Find(&rows); tx.Error != nil {
			return tx.Error
		}
	}

	r["rows"] = rows

	return r
}
